﻿using System.Collections.Generic;
using System.Linq;
using MongoDB.Driver;
using MongoDB.Bson;
using System.Configuration;
using System.Linq.Expressions;
using System;

namespace SmartFrame_DataCollect
{
    public sealed class MongoDBHelper 
    {
        /// <summary>
        /// 数据连接IP mongodb://127.0.0.1:27017
        /// </summary>
        public static string connectionString_Default = ConfigurationManager.AppSettings["monogodb_conn"];
        /// <summary>
        /// 数据库 "名称"
        /// </summary>
        public static string database_Default = ConfigurationManager.AppSettings["mongdbName"];
        /// <summary>
        /// 私有的数据库属性
        /// </summary>
        private static IMongoDatabase database { get; set; }
        /// <summary>
        /// 私有的客户端属性
        /// </summary>
        private static MongoClient client { get; set; }

        /// <summary>
        /// 创建Mogodb配置服务
        /// </summary>
        //private static void CreateMongodbServer()
        //{
        //    client = new MongoClient(connectionString_Default);
        //    database = client.GetDatabase(database_Default);

        //}
        public static void SetConfig(string connectionString,string databaseName)
        {
            connectionString_Default = connectionString;
            database_Default = databaseName;
        }

        #region 新增
        /// <summary>
        /// 插入一条
        /// </summary>
        /// <typeparam name="T">实体类</typeparam>
        /// <param name="collectionName">表名</param>
        /// <param name="entity">实体</param>
        /// <returns></returns>
        public static void InsertOne<T>(string collectionName, T entity)
        {
            MongoDBHelper.InsertOne<T>(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, entity);
        }

        /// <summary>
        /// 插入一条
        /// </summary>
        /// <typeparam name="T">实体类</typeparam>
        /// <param name="connectionString">连接</param>
        /// <param name="databaseName">数据库</param>
        /// <param name="collectionName">表明</param>
        /// <param name="entity">实体</param>
        /// <returns></returns>
        public static void InsertOne<T>(string databaseName, string collectionName, T entity)
        {
            MongoDBHelper.InsertOne<T>(MongoDBHelper.connectionString_Default, databaseName, collectionName, entity);
        }

        /// <summary>
        /// 插入一条
        /// </summary>
        /// <typeparam name="T">实体类</typeparam>
        /// <param name="connectionString">连接</param>
        /// <param name="databaseName">数据库</param>
        /// <param name="collectionName">表明</param>
        /// <param name="entity">实体</param>
        /// <returns></returns>
        public static void InsertOne<T>(string connectionString, string databaseName, string collectionName, T entity)
        {   
            client = new MongoClient(connectionString);
            MongoDatabaseSettings settiing = new MongoDatabaseSettings();
            database = client.GetDatabase(databaseName);
            var collect = database.GetCollection<T>(collectionName);
            // 创建一个索引，指定过期时间为10分钟
            var expireAfter = new TimeSpan(30*24, 0, 0); // 1个月
            var field = new StringFieldDefinition<T>("CJDateTime");
            //var indexDefinition = new IndexKeysDefinitionBuilde();

            var indexDefinition = new IndexKeysDefinitionBuilder<T>();
            // 为包含LastUpdated字段的索引创建过期时间
            var options = new CreateIndexOptions {  ExpireAfter = expireAfter };
            var indexModel = new CreateIndexModel<T>(indexDefinition.Ascending(field), options);
            // 在集合上创建索引
            collect.Indexes.CreateOne(indexModel);
            collect.InsertOne(entity);
        }


        /// <summary>
        ///  批量插入
        /// </summary>
        /// <typeparam name="T">类</typeparam>
        /// <param name="collectionName">表名</param>
        /// <param name="entitys">实体</param>
        /// <returns></returns>
        public static void InsertAll<T>(string databaseName, string collectionName, IEnumerable<T> entitys)
        {
            MongoDBHelper.InsertAll<T>(MongoDBHelper.connectionString_Default, databaseName, collectionName, entitys);
        }
        public static void InsertAll<T>(string connectionString, string databaseName, string collectionName, IEnumerable<T> entitys)
        {
            client = new MongoClient(connectionString);
            database = client.GetDatabase(databaseName);
            var collect = database.GetCollection<T>(collectionName);

            collect.InsertMany(entitys);
        }
        #endregion
        //#region 修改
        ///// <summary>
        ///// 修改实体
        ///// </summary>
        ///// <typeparam name="T">实体类</typeparam>
        ///// <param name="collectionName">表名</param>
        ///// <param name="entity">实体</param>
        ///// <returns></returns>
        //public static WriteConcernResult UpdateOne<T>(string collectionName, T entity)
        //{
        //    return MongoDBHelper.UpdateOne<T>(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, entity);
        //}
        //public static WriteConcernResult UpdateOne<T>(string databaseName, string collectionName, T entity)
        //{
        //    return MongoDBHelper.UpdateOne<T>(MongoDBHelper.connectionString_Default, databaseName, collectionName, entity);
        //}
        //public static void UpdateOne<T>(string connectionString, string databaseName, string collectionName, Expression<Func<T, bool>> filter, T entity)
        //{
        //    client = new MongoClient(connectionString);
        //    database = client.GetDatabase(databaseName);
        //    var collect = database.GetCollection<T>(collectionName);
        //    collect.ReplaceOne(Builders<T>.Filter.Eq("_id", entity.), entity);

        //    collect.UpdateOne<T>(filter,)



        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        result = myCollection.Save(entity);
        //    }
        //    return result;
        //}
        ///// <summary>
        ///// 选择修改
        ///// </summary>
        ///// <typeparam name="T">实体类</typeparam>
        ///// <param name="collectionName">表名</param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <param name="update">更新设置。调用示例：Update.Set("Title", "yanc") 或者 Update.Set("Title", "yanc").Set("Author", "yanc2") 等等</param>
        ///// <returns></returns>
        //public static WriteConcernResult UpdateAll<T>(string collectionName, IMongoQuery query, IMongoUpdate update)
        //{
        //    return MongoDBHelper.UpdateAll<T>(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, query, update);
        //}
        ///// <summary>
        ///// 
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="connectionString"></param>
        ///// <param name="databaseName"></param>
        ///// <param name="collectionName"></param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <param name="update">更新设置。调用示例：Update.Set("Title", "yanc") 或者 Update.Set("Title", "yanc").Set("Author", "yanc2") 等等</param>
        ///// <returns></returns>
        //public static WriteConcernResult UpdateAll<T>(string connectionString, string databaseName, string collectionName, IMongoQuery query, IMongoUpdate update)
        //{
        //    WriteConcernResult result;
        //    if (null == query || null == update)
        //    {
        //        return null;
        //    }
        //    CreateMongodbServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(databaseName);
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        result = myCollection.Update(query, update, UpdateFlags.Multi);
        //    }
        //    return result;
        //}
        //#endregion
        //#region 删除
        ///// <summary>
        /////  根据ID删除
        ///// </summary>
        ///// <param name="collectionName">表名</param>
        ///// <param name="_id"></param>
        ///// <returns></returns>
        //public static WriteConcernResult Delete(string collectionName, string _id)
        //{
        //    return MongoDBHelper.Delete(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, _id);
        //}

        //public static WriteConcernResult Delete(string databaseName, string collectionName, string _id)
        //{
        //    return MongoDBHelper.Delete(MongoDBHelper.connectionString_Default, databaseName, collectionName, _id);
        //}

        //public static WriteConcernResult Delete(string connectionString, string databaseName, string collectionName, string _id)
        //{
        //    WriteConcernResult result;
        //    ObjectId id;
        //    if (!ObjectId.TryParse(_id, out id))
        //    {
        //        return null;
        //    }
        //    CreateMongodbServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(databaseName);
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        result = myCollection.Remove(Query.EQ("_id", id));
        //    }
        //    return result;
        //}
        ///// <summary>
        ///// 删除表里所有记录
        ///// </summary>
        ///// <param name="collectionName"></param>
        ///// <returns></returns>
        //public static WriteConcernResult DeleteAll(string collectionName)
        //{
        //    return MongoDBHelper.DeleteAll(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, null);
        //}
        ///// <summary>
        ///// 更具条件删除
        ///// </summary>
        ///// <param name="collectionName"></param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <returns></returns>
        //public static WriteConcernResult DeleteAll(string collectionName, IMongoQuery query)
        //{
        //    return MongoDBHelper.DeleteAll(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, query);
        //}
        ///// <summary>
        ///// 
        ///// </summary>
        ///// <param name="connectionString"></param>
        ///// <param name="databaseName"></param>
        ///// <param name="collectionName"></param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <returns></returns>
        //public static WriteConcernResult DeleteAll(string connectionString, string databaseName, string collectionName, IMongoQuery query)
        //{
        //    CreateMongodbServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(databaseName);
        //    WriteConcernResult result;
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        if (null == query)
        //        {
        //            result = myCollection.RemoveAll();
        //        }
        //        else
        //        {
        //            result = myCollection.Remove(query);
        //        }
        //    }
        //    return result;
        //}
        //#endregion
        #region 获取单条信息
        /// <summary>
        /// 更具id获取
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="collectionName"></param>
        /// <param name="_id"></param>
        /// <returns></returns>
        public static T GetOne<T>(string collectionName, string _id)
        {
            return MongoDBHelper.GetOne<T>(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, _id);
        }
        /// <summary>
        /// 更具id获取
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="collectionName"></param>
        /// <param name="_id"></param>
        /// <returns></returns>
        public static T GetOne<T>(string databaseName, string collectionName, string _id)
        {
            return MongoDBHelper.GetOne<T>(MongoDBHelper.connectionString_Default, databaseName, collectionName, _id);
        }
        public static T GetOne<T>(string connectionString, string databaseName, string collectionName, string _id)
        {
            client = new MongoClient(connectionString);
            database = client.GetDatabase(databaseName);
            var collect = database.GetCollection<T>(collectionName);

            return collect.Find(Builders<T>.Filter.Eq("_id", _id)).FirstOrDefault();
        }

        #endregion
        #region 获取多个

        /// <summary>
        ///  获取所有记录
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="collectionName"></param>
        /// <returns></returns>
        public static List<T> GetAll<T>(string connectionString, string databaseName, string collectionName, FilterDefinition<T> filter)
        {
            client = new MongoClient(connectionString);
            database = client.GetDatabase(databaseName);
            var collect = database.GetCollection<T>(collectionName);

            return collect.Find(filter).ToList<T>();
        }
        ///// <summary>
        ///// 获取指定数量
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="collectionName"></param>
        ///// <param name="count"></param>
        ///// <returns></returns>
        //public static List<T> GetAll<T>(string collectionName, int count)
        //{
        //    return MongoDBHelper.GetAll<T>(collectionName, count, null, null);
        //}
        ///// <summary>
        ///// 获取指定条件记录，指定条数
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="collectionName"></param>
        ///// <param name="count"></param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <returns></returns>
        //public static List<T> GetAll<T>(string collectionName, int count, IMongoQuery query)
        //{
        //    return MongoDBHelper.GetAll<T>(collectionName, count, query, null);
        //}
        ///// <summary>
        ///// 
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="collectionName"></param>
        ///// <param name="count"></param>
        ///// <param name="sortBy">排序用的。调用示例：SortBy.Descending("Title") 或者 SortBy.Descending("Title").Ascending("Author")等等</param>
        ///// <returns></returns>
        //public static List<T> GetAll<T>(string collectionName, int count, IMongoSortBy sortBy)
        //{
        //    return MongoDBHelper.GetAll<T>(collectionName, count, null, sortBy);
        //}
        ///// <summary>
        ///// 
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="collectionName"></param>
        ///// <param name="count"></param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <param name="sortBy">排序用的。调用示例：SortBy.Descending("Title") 或者 SortBy.Descending("Title").Ascending("Author")等等</param>
        ///// <param name="fields">只返回所需要的字段的数据。调用示例："Title" 或者 new string[] { "Title", "Author" }等等</param>
        ///// <returns></returns>
        //public static List<T> GetAll<T>(string collectionName, int count, IMongoQuery query, IMongoSortBy sortBy, params string[] fields)
        //{
        //    PagerInfo pagerInfo = new PagerInfo();
        //    pagerInfo.Page = 1;
        //    pagerInfo.PageSize = count;
        //    return MongoDBHelper.GetAll<T>(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, query, pagerInfo, sortBy, fields);
        //}
        //public static List<T> GetAll<T>(string databaseName,string collectionName, int count, IMongoQuery query, IMongoSortBy sortBy, params string[] fields)
        //{
        //    PagerInfo pagerInfo = new PagerInfo();
        //    pagerInfo.Page = 1;
        //    pagerInfo.PageSize = count;
        //    return MongoDBHelper.GetAll<T>(MongoDBHelper.connectionString_Default, databaseName, collectionName, query, pagerInfo, sortBy, fields);
        //}

        ///// <summary>
        ///// 翻页获取指定数据
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="collectionName"></param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <param name="pagerInfo"></param>
        ///// <returns></returns>
        //public static List<T> GetAll<T>(string collectionName, IMongoQuery query, PagerInfo pagerInfo)
        //{
        //    return MongoDBHelper.GetAll<T>(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, query, pagerInfo, null);
        //}
        ///// <summary>
        /////  翻页获取指定数据
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="collectionName"></param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <param name="pagerInfo"></param>
        ///// <param name="sortBy">排序用的。调用示例：SortBy.Descending("Title") 或者 SortBy.Descending("Title").Ascending("Author")等等</param>
        ///// <returns></returns>
        //public static List<T> GetAll<T>(string collectionName, IMongoQuery query, PagerInfo pagerInfo, IMongoSortBy sortBy)
        //{
        //    return MongoDBHelper.GetAll<T>(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, query, pagerInfo, sortBy);
        //}
        ///// <summary>
        /////  翻页获取指定数据 返回指定字段
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="collectionName"></param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <param name="pagerInfo"></param>
        ///// <param name="fields">只返回所需要的字段的数据。调用示例："Title" 或者 new string[] { "Title", "Author" }等等</param>
        ///// <returns></returns>
        //public static List<T> GetAll<T>(string collectionName, IMongoQuery query, PagerInfo pagerInfo, params string[] fields)
        //{
        //    return MongoDBHelper.GetAll<T>(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, query, pagerInfo, null, fields);
        //}
        ///// <summary>
        /////  翻页获取指定数据 返回指定字段
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="collectionName"></param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <param name="pagerInfo"></param>
        ///// <param name="sortBy">排序用的。调用示例：SortBy.Descending("Title") 或者 SortBy.Descending("Title").Ascending("Author")等等</param>
        ///// <param name="fields">只返回所需要的字段的数据。调用示例："Title" 或者 new string[] { "Title", "Author" }等等</param>
        ///// <returns></returns>
        //public static List<T> GetAll<T>(string collectionName, IMongoQuery query, PagerInfo pagerInfo, IMongoSortBy sortBy, params string[] fields)
        //{
        //    return MongoDBHelper.GetAll<T>(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, query, pagerInfo, sortBy, fields);
        //}
        ///// <summary>
        /////  翻页获取指定数据 返回指定字段
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="connectionString"></param>
        ///// <param name="databaseName"></param>
        ///// <param name="collectionName"></param>
        ///// <param name="query">条件查询。 调用示例：Query.Matches("Title", "感冒") 或者 Query.EQ("Title", "感冒") 或者Query.And(Query.Matches("Title", "感冒"),Query.EQ("Author", "yanc")) 等等</param>
        ///// <param name="pagerInfo"></param>
        ///// <param name="sortBy">排序用的。调用示例：SortBy.Descending("Title") 或者 SortBy.Descending("Title").Ascending("Author")等等</param>
        ///// <param name="fields">只返回所需要的字段的数据。调用示例："Title" 或者 new string[] { "Title", "Author" }等等</param>
        ///// <returns></returns>
        //public static List<T> GetAll<T>(string connectionString, string databaseName, string collectionName, IMongoQuery query, PagerInfo pagerInfo, IMongoSortBy sortBy, params string[] fields)
        //{
        //    client = new MongoClient(connectionString);
        //    server = client.GetServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(databaseName);

        //    List<T> result = new List<T>();
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        MongoCursor<T> myCursor;
        //        if (null == query)
        //        {
        //            myCursor = myCollection.FindAllAs<T>();
        //        }
        //        else
        //        {
        //            myCursor = myCollection.FindAs<T>(query);
        //        }
        //        if (null != sortBy)
        //        {
        //            myCursor.SetSortOrder(sortBy);
        //        }
        //        if (null != fields)
        //        {
        //            myCursor.SetFields(fields);
        //        }
        //        foreach (T entity in myCursor.SetSkip((pagerInfo.Page - 1) * pagerInfo.PageSize).SetLimit(pagerInfo.PageSize))//.SetSkip(100).SetLimit(10)是指读取第一百条后的10条数据。
        //        {
        //            result.Add(entity);
        //        }
        //    }
        //    return result;
        //}

        ///// <summary>
        ///// 获取数量
        ///// </summary>
        ///// <typeparam name="T">类型</typeparam>
        ///// <param name="databaseName">数据库</param>
        ///// <param name="collectionName">表名</param>
        ///// <param name="query">查询</param>
        ///// <returns></returns>
        //public static long GetCount<T>(string databaseName, string collectionName, IMongoQuery query)
        //{
        //    CreateMongodbServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(databaseName);
        //    List<T> result = new List<T>();
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        return myCollection.Count(query);
        //    }
        //}
        //#endregion
        //#region 索引
        ///// <summary>
        ///// 创建所有
        ///// </summary>
        ///// <param name="collectionName">表名</param>
        ///// <param name="keyNames">所有集合</param>
        //public static void CreateIndex(string collectionName, params string[] keyNames)
        //{
        //    MongoDBHelper.CreateIndex(MongoDBHelper.connectionString_Default, MongoDBHelper.database_Default, collectionName, keyNames);
        //}
        ///// <summary>
        ///// 创见所有
        ///// </summary>
        ///// <param name="connectionString"></param>
        ///// <param name="databaseName"></param>
        ///// <param name="collectionName"></param>
        ///// <param name="keyNames"></param>
        //public static void CreateIndex(string connectionString, string databaseName, string collectionName, params string[] keyNames)
        //{
        //    if (null == keyNames)
        //    {
        //        return;
        //    }
        //    CreateMongodbServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(databaseName);
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        if (!myCollection.IndexExists(keyNames))
        //        {
        //            myCollection.CreateIndex(keyNames);
        //        }
        //    }
        //}
        ///// <summary>
        ///// 分页查询
        ///// </summary>
        ///// <typeparam name="T">实体对象</typeparam>
        ///// <param name="collectionName">表名</param>
        ///// <param name="query">查询条件</param>
        ///// <param name="sort">排序</param>
        ///// <param name="pageIndex">页序</param>
        ///// <param name="pageSize">页数</param>
        ///// <param name="totalCount">总页数</param>
        ///// <returns></returns>
        //public static List<T> GetPage<T>(string databaseName, string collectionName, IMongoQuery query, IMongoSortBy sort, int pageIndex, int pageSize, out long totalCount)
        //{
        //    CreateMongodbServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(databaseName);
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        totalCount = myCollection.Count(query);
        //    }
        //    return GetAll<T>(connectionString_Default,databaseName,collectionName, query, new PagerInfo() { Page = pageIndex, PageSize = pageSize }, sort);
        //}


        ///// <summary>
        ///// 分页查询
        ///// </summary>
        ///// <typeparam name="T">实体对象</typeparam>
        ///// <param name="collectionName">表名</param>
        ///// <param name="query">查询条件</param>
        ///// <param name="sort">排序</param>
        ///// <param name="pageIndex">页序</param>
        ///// <param name="pageSize">页数</param>
        ///// <param name="totalCount">总页数</param>
        ///// <returns></returns>
        //public static List<T> GetPage<T>(string collectionName, IMongoQuery query, IMongoSortBy sort, int pageIndex, int pageSize, out long totalCount)
        //{
        //    CreateMongodbServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(database_Default);
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        totalCount = myCollection.Count(query);
        //    }
        //    return GetAll<T>(collectionName, query, new PagerInfo() { Page = pageIndex, PageSize = pageSize }, sort);
        //}
        ///// <summary>
        ///// 指定库分页查询
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="connectionString"></param>
        ///// <param name="databaseName"></param>
        ///// <param name="collectionName"></param>
        ///// <param name="query"></param>
        ///// <param name="sort"></param>
        ///// <param name="pageIndex"></param>
        ///// <param name="pageSize"></param>
        ///// <param name="totalCount"></param>
        ///// <returns></returns>
        //public static List<T> GetPage<T>(string connectionString, string databaseName, string collectionName, IMongoQuery query, IMongoSortBy sort, int pageIndex, int pageSize, out long totalCount)
        //{
        //    client = new MongoClient(connectionString);
        //    server = client.GetServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(databaseName);
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        totalCount = myCollection.Count(query);
        //    }
        //    return GetAll<T>(connectionString, databaseName, collectionName, query, new PagerInfo() { Page = pageIndex, PageSize = pageSize }, sort);
        //}
        ////connectionString_Default
        ///// <summary>
        ///// 分组
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="collectionName"></param>
        ///// <param name="query"></param>
        ///// <returns></returns>
        //public static List<BsonDocument> GetGroup(string batabase,string collectionName, IMongoQuery query,IMongoGroupBy GroupBy,BsonDocument inital,BsonJavaScript reduce,BsonJavaScript finalize)
        //{
        //    CreateMongodbServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(batabase);
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        return myCollection.Group(query, GroupBy, inital, reduce, finalize).ToList();
        //    }
        //}

        ///// <summary>
        ///// 分组
        ///// </summary>
        ///// <typeparam name="T"></typeparam>
        ///// <param name="collectionName"></param>
        ///// <param name="query"></param>
        ///// <returns></returns>
        //public static MapReduceResult GetReduce(string connectionString, string batabase, string collectionName, IMongoQuery query, BsonJavaScript map, BsonJavaScript reduce, IMongoMapReduceOptions options)
        //{
        //    client = new MongoClient(connectionString);
        //    server = client.GetServer();
        //    //获取数据库或者创建数据库（不存在的话）。
        //    database = server.GetDatabase(batabase);
        //    using (server.RequestStart(database))//开始连接数据库。
        //    {
        //        MongoCollection<BsonDocument> myCollection = database.GetCollection<BsonDocument>(collectionName);
        //        return myCollection.MapReduce(query, map, reduce, options);
        //    }
        //}
        #endregion
    }

    public class PagerInfo
    {
        public int Page;
        public int PageSize;
    }
}



